home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / graphic / frasr182.zip / PRINTER.C < prev    next >
C/C++ Source or Header  |  1993-08-02  |  46KB  |  1,511 lines

  1. /*  Printer.c
  2.  *    This module is linked as an overlay, use ENTER_OVLY and EXIT_OVLY.
  3.  *    Simple screen printing functions for FRACTINT
  4.  *    By Matt Saucier CIS: [72371,3101]      7/2/89
  5.  *    "True-to-the-spirit" of FRACTINT, this code makes few checks that you
  6.  *    have specified a valid resolution for the printer (just in case yours
  7.  *    has more dots/line than the Standard HP and IBM/EPSON,
  8.  *    (eg, Wide Carriage, etc.))
  9.  *
  10.  *    PostScript support by Scott Taylor [72401,410] / (DGWM18A)   10/8/90
  11.  *    For PostScript, use 'printer=PostScript/resolution' where resolution
  12.  *    is ANY NUMBER between 10 and 600. Common values: 300,150,100,75.
  13.  *    Default resolution for PostScript is 150 pixels/inch.
  14.  *    At 200 DPI, a fractal that is 640x480 prints as a 3.2"x2.4" picture.
  15.  *    PostScript printer names:
  16.  *
  17.  *    PostScript/PS            = Portrait printing
  18.  *    PostScriptH/PostScriptL/PSH/PSL = Landscape printing
  19.  *
  20.  *    This code supports printers attached to a LPTx (1-3) parallel port.
  21.  *    It also now supports serial printers AFTER THEY ARE CONFIGURED AND
  22.  *    WORKING WITH THE DOS MODE COMMAND, eg. MODE COM1:9600,n,8,1 (for HP)
  23.  *    (NOW you can also configure the serial port with the comport= command)
  24.  *    Printing calls are made directly to the BIOS for DOS can't handle fast
  25.  *    transfer of data to the HP.  (Or maybe visa-versa, HP can't handle the
  26.  *    slow transfer of data from DOS)
  27.  *
  28.  *    I just added direct port access for COM1 and COM2 **ONLY**. This method
  29.  *    does a little more testing than BIOS, and may work (especially on
  30.  *    serial printer sharing devices) where the old method doesn't. I noticed
  31.  *    maybe a 5% speed increase at 9600 baud. These are selected in the
  32.  *    printer=.../.../31 for COM1 or 32 for COM2.
  33.  *
  34.  *    I also added direct parallel port access for LPT1 and LPT2 **ONLY**.
  35.  *    This toggles the "INIT" line of the parallel port to reset the printer
  36.  *    for each print session. It will also WAIT for a error / out of paper /
  37.  *    not selected condition instead of quitting with an error.
  38.  *
  39.  *    Supported Printers:    Tested Ok:
  40.  *     HP LaserJet
  41.  *        LJ+,LJII         MDS
  42.  *     Toshiba PageLaser     MDS (Set FRACTINT to use HP)
  43.  *     IBM Graphics         MDS
  44.  *     EPSON
  45.  *        Models?         Untested.
  46.  *     IBM LaserPrinter
  47.  *        with PostScript     SWT
  48.  *     HP Plotter         SWT
  49.  *
  50.  *    Future support to include OKI 20 (color) printer, and just about
  51.  *    any printer you request.
  52.  *
  53.  *    Future modifications to include a more flexible, standard interface
  54.  *    with the surrounding program, for easier portability to other
  55.  *    programs.
  56.  *
  57.  * PostScript Styles:
  58.  *  0  Dot
  59.  *  1  Dot*           [Smoother]
  60.  *  2  Inverted Dot
  61.  *  3  Ring
  62.  *  4  Inverted Ring
  63.  *  5  Triangle        [45-45-90]
  64.  *  6  Triangle*       [30-75-75]
  65.  *  7  Grid
  66.  *  8  Diamond
  67.  *  9  Line
  68.  * 10  Microwaves
  69.  * 11  Ellipse
  70.  * 12  RoundBox
  71.  * 13  Custom
  72.  * 14  Star
  73.  * 15  Random
  74.  * 16  Line*           [Not much different]
  75.  *
  76.  *  *  Alternate style
  77.  *
  78.  
  79.  */
  80.  
  81. #include <stdlib.h>
  82.  
  83. #ifndef XFRACT
  84. #include <bios.h>
  85. #include <dos.h>
  86. #include <io.h>
  87. #endif
  88.  
  89. #include <fcntl.h>
  90. #include <sys/types.h>
  91. #include <errno.h>
  92. #include <stdio.h>    /*** for vsprintf prototype ***/
  93.  
  94. #ifndef XFRACT
  95. #include <conio.h>
  96. #include <stdarg.h>
  97. #else
  98. #include <varargs.h>
  99. #endif
  100.  
  101. #include <string.h>
  102. #include <float.h>    /* for pow() */
  103. #include <math.h>    /*  "    "   */
  104. #include "fractint.h"
  105. #include "fractype.h"
  106. #include "prototyp.h"
  107.  
  108. /* macros for near-space-saving purposes */
  109. /* CAE 9211 changed these for BC++ */
  110. #define PRINTER_PRINTF2(X,Y) {\
  111.    static char far tmp[] = X;\
  112.    Printer_printf(tmp,(Y));\
  113. }
  114. #define PRINTER_PRINTF3(X,Y,Z) {\
  115.    static char far tmp[] = X;\
  116.    Printer_printf(tmp,(Y),(Z));\
  117. }
  118. #define PRINTER_PRINTF4(X,Y,Z,W) {\
  119.    static char far tmp[] = X;\
  120.    Printer_printf(tmp,(Y),(Z),(W));\
  121. }
  122.  
  123. /********      PROTOTYPES     ********/
  124.  
  125. #ifndef XFRACT
  126. static void Printer_printf(char far *fmt,...);
  127. #else
  128. static void Printer_printf();
  129. #endif
  130. static int  _fastcall printer(int c);
  131. static void _fastcall print_title(int,int,char *);
  132. static void printer_reset();
  133. static rleprolog(int x,int y);
  134. static void _fastcall graphics_init(int,int,char *);
  135.  
  136. /********  EXTRN GLOBAL VARS  ********/
  137.  
  138. extern int xdots,ydots,            /* size of screen           */
  139.        fractype;               /* used for title block           */
  140. extern SEGTYPE       extraseg;           /* used for buffering           */
  141. extern BYTE dacbox[256][3];   /* for PostScript printing       */
  142. extern BYTE dstack[2][3][400];
  143. extern char FormName[];            /* for Title block info           */
  144. extern char LName[];               /* for Title block info           */
  145. extern char IFSName[];               /* for Title block info           */
  146. extern char PrintName[];           /* Filename for print-to-file       */
  147. extern float finalaspectratio;
  148. extern double xxmin,xxmax,xx3rd,
  149.           yymin,yymax,yy3rd,param[]; /* for Title block info       */
  150. extern int colors;
  151. extern int dotmode;
  152. extern unsigned int debugflag;
  153.  
  154. extern unsigned int  far pj_patterns[];
  155. extern BYTE far pj_reds[];
  156. extern BYTE far pj_blues[];
  157. extern BYTE far pj_greens[];
  158.  
  159. /********    GLOBALS       ********/
  160.  
  161. int Printer_Resolution,        /* 75,100,150,300 for HP;           */
  162.                    /* 60,120,240 for IBM;               */
  163.                    /* 90 or 180 for the PaintJet;           */
  164.                    /* 10-600 for PS                */
  165.                    /* 1-20 for Plotter               */
  166.     LPTNumber,               /* ==1,2,3 LPTx; or 11,12,13,14 for COM1-4  */
  167.                    /* 21,22 for direct port access for LPT1-2  */
  168.                    /* 31,32 for direct port access for COM1-2  */
  169.     Printer_Type,               /* ==1 HP,
  170.                       ==2 IBM/EPSON,
  171.                       ==3 Epson color,
  172.                       ==4 HP PaintJet,
  173.                       ==5,6 PostScript,
  174.                       ==7 HP Plotter           */
  175.     Printer_Titleblock,       /* Print info about the fractal?           */
  176.     Printer_Compress,          /* PostScript only - rle encode output       */
  177.     Printer_ColorXlat,          /* PostScript only - invert colors       */
  178.     Printer_SetScreen,          /* PostScript only - reprogram halftone ?    */
  179.     Printer_SFrequency,       /* PostScript only - Halftone Frequency K    */
  180.     Printer_SAngle,           /* PostScript only - Halftone angle     K    */
  181.     Printer_SStyle,           /* PostScript only - Halftone style     K    */
  182.     Printer_RFrequency,       /* PostScript only - Halftone Frequency R    */
  183.     Printer_RAngle,           /* PostScript only - Halftone angle     R    */
  184.     Printer_RStyle,           /* PostScript only - Halftone style     R    */
  185.     Printer_GFrequency,       /* PostScript only - Halftone Frequency G    */
  186.     Printer_GAngle,           /* PostScript only - Halftone angle     G    */
  187.     Printer_GStyle,           /* PostScript only - Halftone style     G    */
  188.     Printer_BFrequency,       /* PostScript only - Halftone Frequency B    */
  189.     Printer_BAngle,           /* PostScript only - Halftone angle     B    */
  190.     Printer_BStyle,           /* PostScript only - Halftone style     B    */
  191.     Print_To_File,          /* Print to file toggle               */
  192.     EPSFileType,          /* EPSFileType -
  193.                            1 = well-behaved,
  194.                            2 = much less behaved,
  195.                            3 = not well behaved       */
  196.     Printer_CRLF,             /* (0) CRLF (1) CR (2) LF                    */
  197.     ColorPS;                  /* (0) B&W  (1) Color                        */
  198. int pj_width;
  199. double ci,ck;
  200.  
  201. static int repeat, item, count, repeatitem, itembuf[128], rlebitsperitem,
  202.     rlebitshift, bitspersample, rleitem, repeatcount, itemsperline, items,
  203.     bitsperitem, bitshift;
  204.     
  205. static void putitem(), rleputxelval(), rleflush(), rleputrest();
  206.  
  207. static int LPTn;           /* printer number we're gonna use */
  208.  
  209. static FILE *PRFILE;
  210.  
  211. #define TONES 17           /* Number of PostScript halftone styles */
  212.  
  213. static char *HalfTone[TONES]=  {
  214.              "D mul exch D mul add 1 exch sub",
  215.              "abs exch abs 2 copy add 1 gt {1 sub D mul exch 1 sub D mul add 1 sub} {D mul exch D mul add 1 exch sub} ifelse",
  216.              "D mul exch D mul add 1 sub",
  217.              "D mul exch D mul add 0.6 exch sub abs -0.5 mul",
  218.              "D mul exch D mul add 0.6 exch sub abs 0.5 mul",
  219.              "add 2 div",
  220.              "2 exch sub exch abs 2 mul sub 3 div",
  221.              "2 copy abs